Virtual machines are abstract computers for which application software can be compiled. The virtual machine is thus an abstraction level for application software that is consistent between different hardware and operating system combinations. Most of the complexity in running the same application on different platforms is handled by the virtual machine and therefore the virtual machine becomes a very complex piece of software. Modern virtual machines need to manage code generation for the particular processor, operating system dependent resources like threads, networking, and file system. The virtual machine also manages the heap, within which allocation and freeing of virtual machine objects is performed. Examples of such virtual machines include the Java Virtual Machine (JVM) and implementations thereof, including the JRockit JVM from BEA Systems Inc. and the Hotspot JVM from Sun Microsystems, Inc. The definition of the Java Virtual Machine (JVM) does not specify any requirements on the performance or the behaviour of the garbage collection process apart from basic assumptions such as: unused memory should be reused for new objects, and finalizers should be called when objects are to be released. The exact details are explained in the book “The Java™ Virtual Machine Specification (2nd Edition)” by Tim Lindholm published by Sun, and incorporated herein by reference. The JVM implementor can therefore choose to optimize different kinds of behaviours depending on the requirements of the application software and the features of the particular hardware used. A perfect garbage collector would be undetectable to the application software and the software user; there would be no pauses, no extra CPU or memory consumption. Unfortunately no such garbage collector exists, and a lot of work has been invested into achieving high performance object allocation and garbage collection with different algorithms for different goals.